package com.yeqing.crazymakercircle.bufferDemo;

import java.io.*;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.charset.StandardCharsets;

public class UseChannel {
    public static void useFileChannel(String srcFile, String destFile) {
        try (
                // 创建一个文件输入流
                FileInputStream fis = new FileInputStream(srcFile);
                // 创建一个文件输出流
                FileOutputStream fos = new FileOutputStream(destFile);
                ) {
            // 获取文件流的通道
            FileChannel inChannel = fis.getChannel();
            // 获取文件流的通道
            FileChannel outChannel = fos.getChannel();
        } catch (FileNotFoundException e) {
            throw new RuntimeException(e);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    public static void useRandomFileChannel(String srcFile, String destFile) {
        try (
                // 也可以通过RandomAccessFile文件随机访问类，获取FileChannel文件通道实例，代码如下：
                // 创建RandomAccessFile随机访问对象
                RandomAccessFile rFile = new RandomAccessFile(srcFile,"rw");
                // 创建一个文件输出流
                FileOutputStream fos = new FileOutputStream(destFile);
                ) {
                // 获取文件流的通道（可读可写）
                FileChannel channel = rFile.getChannel();
        } catch (FileNotFoundException e) {
            throw new RuntimeException(e);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    public static void useRandomFileChannel2(String srcFile, String destFile) {
        try (
                // 也可以通过RandomAccessFile文件随机访问类，获取FileChannel文件通道实例，代码如下：
                // 创建RandomAccessFile随机访问对象
                RandomAccessFile rFile = new RandomAccessFile(srcFile,"rw");
                // 创建一个文件输出流
                FileOutputStream fos = new FileOutputStream(destFile);
        ) {
            // 获取文件流的通道（可读可写）
            FileChannel channel = rFile.getChannel();
            FileChannel outChannel = fos.getChannel();

            // 创建一个缓冲区
            ByteBuffer buffer = ByteBuffer.allocate(16);

            int length = -1;
            // 读取数据到缓冲区
            while ((length = channel.read(buffer)) != -1) {
                // 本次读取的数据大小
                System.out.println("本次读取了:" + length);
                // 转为读模式
                buffer.flip();
                // 读取缓冲区数据
                int outLen = -1;
                while ((outLen = outChannel.write(buffer)) != 0) {
                    System.out.println("本次写入了:" + outLen);
                }
                // 这次读完清空
                buffer.clear();
            }
        } catch (FileNotFoundException e) {
            throw new RuntimeException(e);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }


    public static void main(String[] args) {
//        useFileChannel("/Users/cyq/Develop/三国/张飞.txt", "/Users/cyq/Develop/三国/张飞111.txt");
        useRandomFileChannel2("/Users/cyq/Develop/三国/张飞.txt", "/Users/cyq/Develop/三国/张飞111.txt");
    }
}
